﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sinacor.UI.Bovespa.Monitoracao.Model
{
    public class HFTProcessMonitorEntity
    {

        public HFTProcessMonitorEntity()
        {
            MsmqMonitor = new MsmqMonitorEntity();
            ErrorData = new ErrorData();
            PortRange = new List<string>();
            ClientRule = new List<int?>();
        }

        ///Id
        public string HftId
        {
            get
            {
                return this.MachineMacAddress + this.ProcessId + this.ThreadId;
            }
        }
        public MsmqMonitorEntity MsmqMonitor { get; set; }

        ///Process Information Begin
        //Limite
        public decimal LimitWaitingOpenOrderAverageTime { get; set; }//Tempo médio aguardando abertura da ordem
        public string LimitWaitingOpenOrderAverageTimeString { get; set; }
        //Informacao
        public long TotalMessages { get; set; }//Total Mensagens Processadas
        public DateTime LastMessageTimeDate { get; set; }//Horário Ultima Msg Processada
        public string LastMessageTime { get; set; }//Horário Ultima Msg Processada
        public int MessagesPerSecond { get; set; }//Número de mensagens processadas por segundo
        public decimal WaitingOpenOrderAverageTime { get; set; }//Tempo médio aguardando abertura da ordem
        public long TotalMsmqConnectionRetries { get; set; }//Número de Tentativas Reconexão com MSMQ (Fila HFT1)
        ///Process Information End

        ///Data Base Information Begin
        //Limite
        public int LimitOperationAverageTime { get; set; }// Tempo médio de operação em banco
        //Informacao
        public int OperationAverageTime { get; set; }// Tempo médio de operação em banco
        public long SuccessfulTriesConnection { get; set; }// Número de Re-Conexões com sucesso no BD
        public long UnsuccessfulTriesConnection { get; set; } // Número de Tentativas Reconexão com Erro no BD
        ///Data Base Information End

        ///ProcessData Information Begin
        //Limite
        public long LimitPrivateMemoryBytes { get; set; }//Private Memory
        public string LimitPrivateMemory { get; set; }//Private Memory
        public int LimitHandleCount { get; set; }//Handle Count
        public int LimitThreadCount { get; set; }//Thread Count

        //Informacao
        public string PrivateMemory { get; set; }//Private Memory
        public long PrivateMemoryBytes { get; set; }//Private Memory
        public int HandleCount { get; set; }//Handle Count
        public int ThreadCount { get; set; }//Thread Count
        public String PrivilegedProcessorTime 
        { 
            get; 
            set; 
        }//Privileged Processor Time
        public TimeSpan PrivilegedProcessorTimeTimeSpan { get; set; }//Privileged Processor Time
        public DateTime InitializedDate { get; set; }//Process Initialized
        public String UpTime { get; set; }//Process Up Time
        public TimeSpan UpTimeTimeSpan { get; set; }//Process Up Time
        ///ProcessData Information End

        ///Extra Information Begin
        public string ProcessName { get; set; }//Process Name
        public long VirtualMemory { get; set; }//Virtual Memory
        public TimeSpan TotalProcessorTime { get; set; }//Total Processor Time
        public string MachineName { get; set; }//Nome da máquina
        public string MachineIPAddress { get; set; }//IP da máquina
        public string MachineMacAddress { get; set; }//MAC ADDRESS DA MAQUINA
        public string ThreadId { get; set; }
        public string ProcessId { get; set; }
        ///Extra Information End
        ///
        public string HFTIdentification
        {
            get
            {
                string ret = " " + this.HftId;
                if (!String.IsNullOrEmpty(this.MachineIPAddress))
                {
                    ret += " IP: " + this.MachineIPAddress;
                }
                return ret;
            }
        }

        public List<string> PortRange
        {
            get;
            set;
        }

        public List<Int32?> ClientRule
        {
            get;
            set;
        }
        public ErrorData ErrorData { get; set; }



    }
}
